package conversion.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import conversion.bean.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * JWT工具类，用于生成、验证和解析JWT Token
 */
@Component
public class JwtUtil {

    private long EXPIRATION_TIME = 24 * 60 * 60 * 1000; // 1 day

    @Value("${jwt.secretKey}")
    private String SECRET_KEY; // 修改为你的密钥

    /**
     * 生成JWT Token
     *
     * @param user 用户
     * @return JWT Token
     */
    public String generateToken(User user) throws JsonProcessingException {
        // 设置Token的过期时间
        Date expiryDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME);
        Date currentDate = new Date(System.currentTimeMillis());

        ObjectMapper objectMapper = new ObjectMapper();
        // 将对象转换为 JSON 字符串
        String userJson = objectMapper.writeValueAsString(user);

        // 使用HMAC256算法和密钥生成Token
        String token = JWT.create()
                .withIssuer("code-conversion")
                .withIssuedAt(currentDate)
                .withExpiresAt(expiryDate) // 设置Token的过期时间
                .withClaim("user",userJson)
                .sign(Algorithm.HMAC256(SECRET_KEY)); // 使用密钥签名Token

        return token;
    }

    /**
     * 验证JWT Token的有效性
     *
     * @param token JWT Token
     * @return 若验证通过返回true，否则返回false
     */
    public boolean verifyToken(String token) {
        try {
            // 使用密钥解析和验证Token
            DecodedJWT jwt = JWT.require(Algorithm.HMAC256(SECRET_KEY))
                    .build()
                    .verify(token);
            return true; // 验证通过，返回true
        } catch (Exception e) {
            return false; // 验证失败，返回false
        }
    }

    /**
     * 从JWT Token中获取用户
     *
     * @param token JWT Token
     * @return 用户名
     */
    public User getUserFromToken(String token) {
        // 解析Token获取DecodedJWT对象
        DecodedJWT jwt = JWT.decode(token);
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.readValue(jwt.getClaim("user").asString(), User.class);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return null;
        }
    }
}